package cn.yanceysong.gitstats;

import cn.yanceysong.gitstats.analyzer.GitStatsAnalyzer;
import cn.yanceysong.gitstats.config.GitStatsConfig;
import cn.yanceysong.gitstats.model.GitStatsResult;
import cn.yanceysong.gitstats.report.ReportGenerator;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;

/**
 * Git统计工具命令行接口
 */
@Slf4j
public class GitStatsTool {

    public static void main(String[] args) {
        if (args.length == 0) {
            printUsage();
            return;
        }

        try {
            String repositoryPath = args[0];
//            String repositoryPath ="C:\\project\\gms";
            File repoDir = new File(repositoryPath);

            if (!repoDir.exists() || !repoDir.isDirectory()) {
                System.err.println("错误: 仓库路径不存在或不是目录: " + repositoryPath);
                return;
            }

            if (!new File(repoDir, ".git").exists()) {
                System.err.println("错误: 指定路径不是Git仓库: " + repositoryPath);
                return;
            }

            // 解析命令行参数
            GitStatsConfig config = parseArguments(args);
//            GitStatsConfig config = GitStatsConfig.builder()
//                    .since(LocalDateTime.of(2024, 8, 24, 0, 0, 0))
//                    .until(LocalDateTime.now())
//                    .build();
            // 创建分析器
            GitStatsAnalyzer analyzer = new GitStatsAnalyzer(repoDir, config);

            // 执行分析
            System.out.println("开始分析Git仓库: " + repositoryPath);
            GitStatsResult result = analyzer.analyze();

            // 生成报告
            ReportGenerator reportGenerator = new ReportGenerator();

            // 控制台输出
            printConsoleReport(result);

            // 生成JSON报告
            String jsonReport = reportGenerator.generateJsonReport(result);
            System.out.println("\n=== JSON报告 ===");
            System.out.println(jsonReport);

//             生成CSV报告
            String csvReport = reportGenerator.generateCsvReport(result);
            System.out.println("\n=== CSV报告 ===");
            System.out.println(csvReport);

            // 生成HTML报告
            String htmlReport = reportGenerator.generateHtmlReport(result);
            System.out.println("\n=== HTML报告生成完成 ===");

            // 保存所有报告到文件
            try {
                String outputDir = "reports";
                reportGenerator.generateAllReports(result, outputDir);
                System.out.println("所有报告已保存到 " + outputDir + " 目录");
            } catch (Exception e) {
                System.err.println("保存报告文件时出错: " + e.getMessage());
            }

        } catch (Exception e) {
            log.error("分析过程中发生错误", e);
            System.err.println("错误: " + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 解析命令行参数
     */
    private static GitStatsConfig parseArguments(String[] args) {
        GitStatsConfig.GitStatsConfigBuilder builder = GitStatsConfig.builder();

        for (int i = 1; i < args.length; i++) {
            String arg = args[i];

            if (arg.startsWith("--since=")) {
                String dateStr = arg.substring("--since=".length());
                LocalDateTime since = LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
                builder.since(since);
            } else if (arg.startsWith("--until=")) {
                String dateStr = arg.substring("--until=".length());
                LocalDateTime until = LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
                builder.until(until);
            } else if (arg.equals("--include-merge")) {
                builder.skipMergeCommits(false);
            } else if (arg.startsWith("--exclude-path=")) {
                String path = arg.substring("--exclude-path=".length());
                builder.excludedPaths(Arrays.asList(path.split(",")));
            } else if (arg.equals("--help")) {
                printUsage();
                System.exit(0);
            }
        }

        return builder.build();
    }

    /**
     * 打印使用说明
     */
    private static void printUsage() {
        System.out.println("Git统计工具 - 分析Git仓库的贡献者统计信息");
        System.out.println();
        System.out.println("用法: java -jar git-stats.jar <仓库路径> [选项]");
        System.out.println();
        System.out.println("选项:");
        System.out.println("  --since=YYYY-MM-DD     统计开始日期");
        System.out.println("  --until=YYYY-MM-DD     统计结束日期");
        System.out.println("  --include-merge        包含合并提交");
        System.out.println("  --exclude-path=路径    排除指定路径的文件（多个路径用逗号分隔）");
        System.out.println("  --help                 显示此帮助信息");
        System.out.println();
        System.out.println("示例:");
        System.out.println("  java -jar git-stats.jar /path/to/repo");
        System.out.println("  java -jar git-stats.jar /path/to/repo --since=2024-01-01 --until=2024-12-31");
        System.out.println("  java -jar git-stats.jar /path/to/repo --exclude-path=target,node_modules");
    }

    /**
     * 打印控制台报告
     */
    private static void printConsoleReport(GitStatsResult result) {
        System.out.println("\n=== Git仓库统计报告 ===");
        System.out.println("仓库路径: " + result.getRepositoryPath());
        System.out.println("统计时间: " + result.getStartTime() + " - " + result.getEndTime());
        System.out.println("总提交数: " + result.getTotalCommits());
        System.out.println("总贡献者数: " + result.getTotalContributors());
        System.out.println("总代码行数: " + result.getTotalLines());
        System.out.println("总新增行数: " + result.getTotalAddedLines());
        System.out.println("总删除行数: " + result.getTotalDeletedLines());
        System.out.println("总修改行数: " + result.getTotalModifiedLines());

        System.out.println("\n=== 贡献者统计 ===");
        System.out.printf("%-20s %-30s %8s %8s %8s %8s %8s%n",
                "姓名", "邮箱", "提交数", "总行数", "新增", "删除", "修改");
        System.out.println("-".repeat(100));

        result.getContributors().stream()
                .sorted((a, b) -> Integer.compare(b.getCommitCount(), a.getCommitCount()))
                .forEach(contributor -> {
                    System.out.printf("%-20s %-30s %8d %8d %8d %8d %8d%n",
                            truncateString(contributor.getName(), 20),
                            truncateString(contributor.getEmail(), 30),
                            contributor.getCommitCount(),
                            contributor.getTotalLines(),
                            contributor.getAddedLines(),
                            contributor.getDeletedLines(),
                            contributor.getModifiedLines());
                });
    }

    /**
     * 截断字符串到指定长度
     */
    private static String truncateString(String str, int maxLength) {
        if (str == null) return "";
        if (str.length() <= maxLength) return str;
        return str.substring(0, maxLength - 3) + "...";
    }
}
